package smallfrench.moteur.noeuds;


import java.util.ArrayList;

import smallfrench.moteur.biblio.RRien;
import smallfrench.moteur.interp.Portee;
import smallfrench.moteur.interp.RObjet;
import smallfrench.moteur.lexer.lexemes.Lexeme;


/**
 * Bloc de noeuds regroupés dans une paire de parenthèses.
 * Tout comme une fonction, définit une nouvelle portée.
 * @author antoine1023
 */
public class NBloc extends Noeud {

	public final ArrayList<Noeud> noeuds;

	/**
	 * Pour l'optimisation
	 * Vrai si au moins un des noeuds enfants est un "var"
	 */
	private boolean contientDeclarations;

	public NBloc(Lexeme token, ArrayList<Noeud> children) {
		super(token);
		noeuds = children;
		for (Noeud n : noeuds) {
			if (n instanceof NDeclaration) {
				contientDeclarations = true;
				break;
			}
		}
	}

	@Override
	public RObjet evaluer(Portee portee) {

		// On crée une nouvelle portée uniquement si besoin
		if (contientDeclarations)
			portee = new Portee(portee);

		RObjet e = RRien.RIEN;

		for (Noeud i : noeuds) {
			e = i.evaluer(portee);
		}

		return e; // On renvoie le dernier résultat.
	}

	@Override
	public String toString() {
		String r = "(";
		for (Noeud i : noeuds) {
			r += i.toString() + " ";
		}
		return r + ")";
	}
}
